// Package api internal/api/role_api.go
package api

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/internal/service"
	"gozrd-admin-api/pkg/response"
	"strconv"
)

// RoleAPI 角色控制器
type RoleAPI struct {
	roleService service.IRoleService
}

// NewRoleAPI 创建角色控制器
func NewRoleAPI(db *gorm.DB) *RoleAPI {
	roleRepo := repository.NewRoleRepository(db)
	roleService := service.NewRoleService(roleRepo)
	return &RoleAPI{
		roleService: roleService,
	}
}

// CreateSysRole 新增角色
// @Summary 新增角色接口
// @Description 创建一个新的角色
// @Tags 角色
// @Accept json
// @Produce json
// @Param data body dto.AddSysRoleDto true "角色信息"
// @Success 200 {object} response.Response "创建成功"
// @Router /role [post]
func (r *RoleAPI) CreateSysRole(c *gin.Context) {
	var roleDTO dto.AddSysRoleDto
	if err := c.ShouldBindJSON(&roleDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	r.roleService.CreateSysRole(c, roleDTO)
}

// GetSysRoleById 根据id查询角色
// @Summary 根据id查询角色接口
// @Description 获取指定ID的角色信息
// @Tags 角色
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Success 200 {object} response.Response "返回角色信息"
// @Router /role/{id} [get]
func (r *RoleAPI) GetSysRoleById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}

	r.roleService.GetSysRoleById(c, id)
}

// UpdateSysRole 修改角色
// @Summary 修改角色接口
// @Description 更新角色信息
// @Tags 角色
// @Accept json
// @Produce json
// @Param data body dto.UpdateSysRoleDto true "角色信息"
// @Success 200 {object} response.Response "更新成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "内部错误"
// @Router /role [put]
func (r *RoleAPI) UpdateSysRole(c *gin.Context) {
	var roleDTO dto.UpdateSysRoleDto
	if err := c.ShouldBindJSON(&roleDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	r.roleService.UpdateSysRole(c, roleDTO)
}

// DeleteSysRoleById 根据id删除角色
// @Summary 根据id删除角色接口
// @Description 删除指定ID的角色
// @Tags 角色
// @Accept json
// @Produce json
// @Param data body dto.SysRoleIdDto true "角色ID"
// @Success 200 {object} response.Response "删除成功"
// @Router /role [delete]
func (r *RoleAPI) DeleteSysRoleById(c *gin.Context) {
	var idDTO dto.SysRoleIdDto
	if err := c.ShouldBindJSON(&idDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	r.roleService.DeleteSysRoleById(c, idDTO)
}

// UpdateSysRoleStatus 角色状态修改
// @Summary 角色状态修改接口
// @Description 修改角色的状态
// @Tags 角色
// @Accept json
// @Produce json
// @Param data body dto.UpdateSysRoleStatusDto true "角色状态信息"
// @Success 200 {object} response.Response "修改成功"
// @Router /role/status [put]
func (r *RoleAPI) UpdateSysRoleStatus(c *gin.Context) {
	var statusDTO dto.UpdateSysRoleStatusDto
	if err := c.ShouldBindJSON(&statusDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	r.roleService.UpdateSysRoleStatus(c, statusDTO)
}

// GetSysRoleList 分页查询角色列表
// @Summary 分页查询角色列表接口
// @Description 分页查询角色列表
// @Tags 角色
// @Accept json
// @Produce json
// @Param pageNum query int false "分页数"
// @Param pageSize query int false "每页数"
// @Param roleName query string false "角色名称"
// @Param status query string false "帐号启用状态：1->启用,2->禁用"
// @Param beginTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} response.Response "返回角色列表"
// @Router /role/list [get]
func (r *RoleAPI) GetSysRoleList(c *gin.Context) {
	// 解析分页参数
	pageNum, _ := strconv.Atoi(c.DefaultQuery("pageNum", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))

	// 解析查询条件
	roleName := c.Query("roleName")
	status := c.Query("status")
	beginTime := c.Query("beginTime")
	endTime := c.Query("endTime")

	r.roleService.GetSysRoleList(c, pageNum, pageSize, roleName, status, beginTime, endTime)
}

// QuerySysRoleVoList 角色下拉列表
// @Summary 角色下拉列表接口
// @Description 获取角色下拉选项列表
// @Tags 角色
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "返回角色下拉列表"
// @Router /role/list/options [get]
func (r *RoleAPI) QuerySysRoleVoList(c *gin.Context) {
	r.roleService.QuerySysRoleVoList(c)
}

// QueryRoleMenuIdList 根据角色id查询菜单数据
// @Summary 根据角色id查询菜单数据接口
// @Description 获取指定角色ID的菜单权限数据
// @Tags 角色
// @Accept json
// @Produce json
// @Param id query int true "角色ID"
// @Success 200 {object} response.Response "返回菜单权限列表"
// @Router /role/menu [get]
func (r *RoleAPI) QueryRoleMenuIdList(c *gin.Context) {
	idStr := c.Query("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}

	r.roleService.QueryRoleMenuIdList(c, id)
}

// AssignPermissions 分配权限
// @Summary 分配权限接口
// @Description 给角色分配菜单权限
// @Tags 角色
// @Accept json
// @Produce json
// @Param data body dto.RoleMenu true "角色菜单权限数据"
// @Success 200 {object} response.Response "分配权限成功"
// @Router /role/permission [put]
func (r *RoleAPI) AssignPermissions(c *gin.Context) {
	var roleMenu dto.RoleMenu
	if err := c.ShouldBindJSON(&roleMenu); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	r.roleService.AssignPermissions(c, roleMenu)
}

// SetRoleServiceForTest 设置角色服务，仅供测试使用
func SetRoleServiceForTest(r *RoleAPI, svc service.IRoleService) {
	r.roleService = svc
}
